﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.CompilerServices;
using AccesoDatos.DAO.Base;
using AccesoDatos.DTO.Base;
using System.Collections.Generic;
using AccesoDatos.DTO;

namespace AccesoDatos.DAO
{

    /// <summary>
    /// Descripcion breve de AlumnoDAO
    /// </summary>
    public class AlumnoDAO : BaseDAO,IDAO
    {
        #region Singleton

        private static AlumnoDAO instance;

        private AlumnoDAO()
        {
            //Vacio
        }

        /// <summary>
        /// Devuelve una instancia de AlumnoDAO
        /// </summary>
        /// <returns>instancia de AlumnoDAODTO</returns>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public static AlumnoDAO GetInstance()
        {
            if (instance == null)
            {
                instance = new AlumnoDAO();
            }

            return instance;
        }

        #endregion

        #region Select

        ///// <summary>
        //   /// Devuelve el listado de clasificaciones que permita el filtro
        //   /// </summary>
        //   /// <param name="filtro">FilterBean donde se rellenaran las propiedades por las que se quiere filtrar</param>
        //   /// <returns>Devuelve una lista de AaiClasificacionDR363FilterBean</returns>
        //   public List<OBJETODTO> GetAaiClasificacionesDR363ByFilter(AaiClasificacionDR363FilterBean filtro)
        //   {  
        //       List<OBJETODTO> lista = new List<OBJETODTO>();
        //       try
        //       {
        //           string sql = @"spu_AaiClasificacionRD363DAO_GetClasificacionesByFilter";
        //           SqlCommand cmd = new SqlCommand(sql, this.ConexionNegocioDB);
        //           cmd.CommandType = CommandType.StoredProcedure;
        //           cmd.Parameters.AddWithValue("@coClasificacion", GetSqlValue(filtro.Co_Clasificacion ));
        //           cmd.Parameters.AddWithValue("@Clasificacion", GetSqlValue(filtro.Clasificacion));
        //           using (SqlDataReader dr = cmd.ExecuteReader())
        //           {
        //               while (dr.Read())
        //               {
        //                   OBJETODTO bean = new AaiClasificacionDR363FilterBean();
        //                   bean.Co_Clasificacion = this.GetStringFromDataReader(dr, "CO_CLASIFICACION");
        //                   bean.Clasificacion = this.GetStringFromDataReader(dr, "CLASIFICACION");
        //                   lista.Add(bean);
        //               }
        //           }
        //           return lista;
        //       }
        //       catch (Exception ex)
        //       {
        //           throw new DAOException(ex);
        //       }
        //   }

        #endregion
       
        #region Metodos privados

        /// <summary>
        /// Funcion que devuelve un alumnodto con todos los datos rellenos
        /// </summary>
        /// <param name="dr"></param>
        /// <returns></returns>
        private AlumnoDTO RellenaBean(SqlDataReader dr) 
        {
            AlumnoDTO bean = new AlumnoDTO();
            bean.CoAlumno = this.GetNullableIntFromDataReader(dr, "CO_ALUMNO");
            bean.CoPersona = this.GetNullableIntFromDataReader(dr, "CO_PERSONA");
            bean.AñoMatriculacion = this.GetNullableDateTimeFromDataReader(dr, "AÑO_MATRICULACION");
            bean.Nombre = this.GetStringFromDataReader(dr, "NOMBRE");
            bean.Apellido1 = this.GetStringFromDataReader(dr, "APELLIDO1");
            bean.Apellido2 = this.GetStringFromDataReader(dr, "APELLIDO2");
            //bean.CoAsignatura = this.GetNullableIntFromDataReader(dr, "CO_ASIGNATURA");
            return bean;
        }

        #endregion

        #region Miembros de IDAO

        /// <summary>
        /// Metodo que inserta un registro en la base de datos
        /// </summary>
        /// <param name="dto">Objeto de IDTO que contiene todos los parametros</param>
        public void Insert(IDTO dto)
        {
            AlumnoDTO filtro = new AlumnoDTO();
            filtro = (AlumnoDTO)dto;
            try
            {
                string sql = "spu_AlumnoDAO_Insert";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));
                cmd.Parameters.AddWithValue("@CoPersona", GetSqlValue(filtro.CoPersona));
                cmd.Parameters.AddWithValue("@AñoMatriculacion", GetSqlValue(filtro.AñoMatriculacion));
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que elimina un regitro de la base de datos
        /// </summary>
        /// <param name="dto">Objeto de IDTO que contiene todos los parametros</param>
        public void Delete(IDTO dto)
        {
            AlumnoDTO filtro = new AlumnoDTO();
            filtro = (AlumnoDTO)dto;
            try
            {
                string sql = "spu_AlumnoDAO_Delete";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));

                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }

        }

        /// <summary>
        /// Metodo que actualiza un registro de la base de datos
        /// </summary>
        /// <param name="filtro">Objeto DTO que contiene los datos para actualizar el registro</param>
        public void Update(IDTO dto)
        {
            AlumnoDTO filtro = new AlumnoDTO();
            filtro = (AlumnoDTO)dto;
            try
            {
                string sql = "spu_AlumnoDAO_Update";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));
                cmd.Parameters.AddWithValue("@CoPersona", GetSqlValue(filtro.CoPersona));
                cmd.Parameters.AddWithValue("@AñoMatriculacion", GetSqlValue(filtro.AñoMatriculacion));
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        //TODO: Comprobar que funcion del select se va a meter aki
        /// <summary>
        /// Funcion que devuelve una lista de objetos IDTO 
        /// </summary>
        /// <param name="filtro">Parametros de busqueda que en este caso es null</param>
        /// <returns>Lista con todos los resultados de la busqueda</returns>
        public List<IDTO> Get(IDTO dto)
        {
            AlumnoDTO filtro = new AlumnoDTO();
            filtro = (AlumnoDTO)dto;
            try
            {
                List<IDTO> lista = new List<IDTO>();
                string sql = "spu_AlumnoDAO_GetAlumnos";
        
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoAlumno",  GetSqlValue(filtro.CoAlumno));
                cmd.Parameters.AddWithValue("@CoPersona", GetSqlValue(filtro.CoPersona));
                cmd.Parameters.AddWithValue("@AñoMatriculacion",  GetSqlValue(filtro.AñoMatriculacion));
                cmd.Parameters.AddWithValue("@CoAsignatura",  GetSqlValue(filtro.CoAsignatura));
                cmd.Parameters.AddWithValue("@Nombre",  GetSqlValue(filtro.Nombre));
                cmd.Parameters.AddWithValue("@Apellido1",  GetSqlValue(filtro.Apellido1));
                cmd.Parameters.AddWithValue("@Apellido2",  GetSqlValue(filtro.Apellido2));
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        AlumnoDTO asignatura = new AlumnoDTO();
                        asignatura = RellenaBean(dr);
                        lista.Add(asignatura);
                    }
                }
                return lista;
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        #endregion
    }
}